
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>组合继承</title>
</head>
<body>
    


    <script>
        // 原型链+借用构造函数的组合继承
        /*
            原型链+借用构造函数的组合继承
            1. 利用原型链实现对父类型对象的方法继承（得到方法）
            2. 利用call()借用父类型构建函数初始化相同属性（得到属性）
            3. 优点：弥补上上面两种方法的缺点
        */


    // 组合继承指的是将原型链和借用构造函数技术组合到一块，从而发挥二者之长的一种继承模式。基本思路：
	// 使用原型链实现对原型属性和方法的继承，通过借用构造函数来实现对实例属性的继承，既通过在原型上定义方法来实现了函数复用，又保证了每个实例都有自己的属性。
	
	// 缺点:
	// 无论什么情况下，都会调用两次超类型构造函数：一次是在创建子类型原型的时候，另一次是在子类型构造函数内部。
	// 优点:
	// 可以向超类传递参数
	// 每个实例都有自己的属性
	// 实现了函数复用

        function SuperType(name) {
            this.name = "yetter"
            this.colors = ['pink', 'blue', 'green']
        }

        SuperType.prototype.sayName = function () {
            return  this.name
        }


        function SubType(name,age) {
            this.age = age
            SuperType.call(this,name) //借用构造函数继承
        }

        SubType.prototype.sayAge = function () {
            return this.age;
        }

        SubType.prototype = new SuperType()//原型链继承
        SubType.prototype.constructor = SubType;

        let ins  = new SubType("mary",18)
        ins.colors.push("yellow")
        console.log(ins.sayName());
        console.log(ins.colors);


        let ins2  = new SubType("jack",20)
        console.log(ins2.colors);



    </script>
</body>
</html>